package com.it.config.controller;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/*
 * TODO 【spring】 (4)、基于注解的方式管理 Bean
 * 【说明】：
 *       当我们创建一个实现类、将它交由在IOC容器中管理、需要再配置类中通过Bean标签的形式
 *       随着项目中组件的不断增多、这种方式无疑是繁琐、且不易维护的
 *
 * 【解决】：
 *       所以就可以使用注解的方式去将实现、ioc控制反转、依赖注入、周期方法、作用域等
 *       大大简化了在配置文件中的书写和操作
 *
 * 【方式】：
 *       配置文件 + 注解方式
 *       Java配置类 + 注解
 *
 * 【注解的使用】：
 *       控制反转：
 *          @Component：应用在组件层
 *          @Controller：应用在控制层（Controller）
 *          @Service：应用在业务层（Service）
 *          @Resource：应用在数据层（Mapper/Dao）
 *
 *       依赖注入:
 *          @Autowired：自动装配
 *              说明：参与自动装配的组件（需要装配、被装配）全部都必须在IoC容器中。
 *                   不区分IoC的方式！XML和注解都可以
 *                   直接在成员变量标记即可、也在标记在构造器、set方法
 *              注意：@Autowired 根据类型进行装配、先根据类型装配、在根据名称装配
 *                  如果存在多个相同类型、通过配合变量上直接标记 @Qualifier("") 定义一个唯一id进行装配
 *
 *          @Qualifier("")：
 *              说明：无法单独使用、通常配合@Autowired使用、为其声明一个唯一id
 *
 *          @Resource
 *              说明：
 *                   如果没有指定name,先根据属性名查找IoC中组件xxxService
 *                   如果没有指定name,并且属性名没有对应的组件,会根据属性类型查找
 *                   可以指定name名称查找!  @Resource(name='test') == @Autowired + @Qualifier(value='test')
 *          @Value：
 *              说明：简单类型注入、通常用于注入外部属性
 *
 *       作用域
 *          @Scope(value = "prototype")
 *                   singleton 单例、 prototype 多例
 *       周期方法
 *
 * */
// 使用该注解、就相当于在 配置文件中 <bean id="" class=""/>、将实现维护在了IOC容器中
@Controller


// 创建set、get方法、构造器等、toString方法
@Data
@AllArgsConstructor
@NoArgsConstructor
@Scope(value = "singleton")
public class spring_04_ioc_note {
    @Value("${user.name}")
    private String name;
    @Value("${user.age}")
    private String age;

    @Autowired
    private spring_01_ioc_xml spring01IocXml;

    @Resource
    private spring_02_ioc_bean spring02IocBean;

    public void method() {
        System.out.println("spring_04_ioc_note：基于注解的方式管理 Bean");
    }

}
